package cn.getech.data.development.dto;

import cn.getech.data.development.entity.JobNodeConfJdbcParam;
import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import lombok.Data;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;


/**
 * 任务配置的枚举
 *
 * @author zenith
 */
@Data
public class JobNodeConfigDto implements Serializable {

    private Integer jobNodeId;

    //调度设置_类型  0不重复 1重复
    private Integer schedule_type;

    private Integer scheduleOrInterval;

    private String expression;

    /***
     * 数据接入和推送模块
     */


    //输入设置_数据源连接类型
    private Integer input_connect_type;
    //输入设置_数据源连接
    private Integer input_connect_id;

    //输入设置_数据源连接名称
    private String input_connect_name;
    //输入设置_输入方式
    private String input_input_type;
    //输入设置_输入内容
    private String input_input_content;

    //输入设置_数据库名称
    private String input_db_name;
    //输入设置_表名称
    private String input_table_name;

    //输入设置_文件位置
    private String input_file_position;

    //输入设置_数据分区
    private String input_data_partition;

    //输入设置_是否设置JDBC参数 0:不设置 1：设置
    private Integer isSetJdbcParam;

    //输入设置_JDBC连接参数
    private List<JobNodeConfJdbcParam> jobNodeConfJdbcParamList;


    //输出设置_数据源连接类型
    private Integer output_connect_type;
    //输出设置_数据源连接
    private Integer output_connect_id;
    //输出设置_数据源连接名称
    private String output_connect_name;
    //输出设置_数据库名称
    private String output_db_name;
    //输出设置_表名称
    private String output_table_name;
    //输出设置_写入模式
    private String output_write_model;
    //输出设置_数据分区
    private String output_data_partition;
    //输出设置_前置语句
    private String output_pre_statment;
    //输出设置_后置语句
    private String output_fix_statment;
    //数据库表名
    private String database_tablename;

    //高级设置_文件数
    private String hight_file_num;
    //高级设置_并发数(期望最大并发数)
    private String hightMaxConcurrent;
    //Ftp文件位置
    private String ftpFileLocation;
    //ftp数据源接入的时候,是否逐行解析
    private Integer nonStandardFormat;

    //是否开启循环取数
    private Integer isOpenLoodAccess;

    //循环取数条数
    private Integer batchSize;

    //循环 取数起始标志
    private String beginGDA;
    //循环取数结束标志
    private String endGDA;
    //循环取数停止标志
    private String stopSign;
    //循环取数停止标志的值
    private String stopSignVal;
    //sap的输出设置_表名称  可以为空
    private List<String> sap_output_table_name;
    //SAP数据源配置信息,json字符串，和数据源原有信息分离
    private String sapConnectFieldInfos;

    /***
     * SQL计算
     */
    private String sql_statment;

    /***
     * 本次任务的输出表ids
     */
    private List<String> jobOutPutTableIds;

    /***
     * 优先级配置  高、中、低
     */
    private String priorityConfig;


    /***
     * 系统参数
     */
    private List<Map<String,Object>> sysParam;

    /***
     * 系统参数--节点
     */
    private List<JSONObject> nodeParam;

    /***
     * 超时时间 单位分钟
     */
    private Integer outHours;
    /***
     * 是否设置超时 0：不设置  1：设置
     */
    private Integer isOpenOutHours;

    /***
     * 程序执行
     */
    //程序主类
    private String base_proc_main_class;
    //输入路径
    private String base_proc_main_in;
    //输出路径
    private String base_proc_main_out;
    //程序参数
    private String base_proc_main_args;
    //程序文件地址
    private String base_proc_main_file;

    //spark.driver.memory
    private String  resource_dm;
    //spark.driver.cores
    private String resource_dc;
    //spark.executor.memory
    private String  resource_em;
    //spark.executor.cores
    private String  resource_ec;

    /**
     * 配置的任务类型，0：节点的配置  1：菜单目录对应的配置（全局配置）
     */
    private Integer jobType;

    //是否开启分页数(0:不开启,1开启)
    private Integer startPageCount;
    //当前页码
    private Integer pageNum;
    //当前页码记录数
    private Integer pageSize;
    //结束标识
    private String endName;
    //是否开启自增
    private Integer enableIncresement;
    //输出的同步任务存储引擎
    private Integer output_storage_engine_type;

    //查询引擎
    private Integer query_engine;

    /******算法开发前端交互字段-start*********/
    //模型类型;
    private String modelTypeId;
    //模型类型名称;
    private String modelTypeName;
    //算法类型;
    private Integer algorithmTypeId;
    //算法类型的名字;
    private String algorithmTypeName;
    //模型id;
    private Integer modelId;
    //模型name;
    private String  modelName;
    //预测输入数据库名称;
    private String inputPreDbName;
    //预测输入数据库id;
    private Integer inputPreDbId;
    //预测输入表的名称;
    private String inputPreTableName;
    //预测输入表id
    private Integer inputPreTableId;
    //预测输出数据库名称;
    private String outputPreDbName;
    //预测输出数据库id;
    private Integer outputPreDbId;
    //预测输出表的名称;
    private String outputPreTableName;
    //预测输出表id
    private Integer outputPreTableId;
    //预测结果字段映射;
    private String preResultInfos;

    /******es的数据源数据同步-start*********/
    private String esSqlCondition;//es的检索条件
    private String esIndex;//索引
    private String esIndexType;//索引类型
    private Long esPageSize;//分页大小
    private Long esPageTime;//单位s

    /******webservice支持raw-start*********/
    private Integer reqType;//1.xml 2.json
    private String webserviceText;//xml请求数据
    private Integer resType;//1.xml 2.json
    private String anaTableNameUrl;//xml解析表的路径，按照.的路径
    private Integer olderRequestType;// 1.GET   2.POST-urlencoded  3.POST-raw

    //配置方式:cronType (1:手动配置 2：crontab表达式)
    //crontab表达式：cronUrl
    private Integer cronType;
    private String cronUrl;

    //FTP文件格式
    private String ftpFileType;
    //FTP文件名匹配方式 1：普通匹配  2：正则匹配  3：日期动态参数配置
    private Integer ftpFileMatchType;
    //FTP文件名
    private String ftpFileName;

//    public static JobNodeConfigDto listToJobNodeConfig(List<JobNodeConf> list) {
//        if (list == null)
//            return null;
//
//        Map<String,Object> map=new HashMap<>();
//        for (JobNodeConf conf:list
//        ) {
//            map.put(conf.getKey(),conf.getValue());
//        }
//        return mapToJobNodeConfigDto(map);
//    }
//
//
//    public static List<JobNodeConf> jobNodeConfigTolist(JobNodeConfigDto jobNodeConfig) {
//        if(jobNodeConfig == null)
//            return null;
//
//        Map<Object,Object> map= new org.apache.commons.beanutils.BeanMap(jobNodeConfig);
//        List<JobNodeConf> list=new ArrayList<>();
//        for (Object k:map.keySet()
//        ) {
//
//            if(map.get(k) !=null && !("class".equals(k))) {
//                JobNodeConf conf = new JobNodeConf();
//                conf.setKey(String.valueOf(k));
//                conf.setValue(String.valueOf(map.get(k)));
//                conf.setJobNodeId(jobNodeConfig.getJobNodeId());
//                list.add(conf);
//            }
//        }
//        return  list;
//
//    }



    public static JobNodeConfigDto mapToJobNodeConfigDto(Map<String, Object> map) {
        if (map == null)
            return null;
        JobNodeConfigDto obj;
        try {
            Object nodeParam = map.get("nodeParam");
            Object preResultInfos = map.get("preResultInfos");
            Object jobNodeConfJdbcParamList = map.get("jobNodeConfJdbcParamList");
            if(null != nodeParam){
                map.remove("nodeParam");
            }
//            if(null != preResultInfos){
//                map.remove("preResultInfos");
//            }
            if(null != jobNodeConfJdbcParamList){
                map.remove("jobNodeConfJdbcParamList");
            }

            JSONObject jsonObject = JSONObject.parseObject(JSON.toJSONString(map));
            obj = JSON.parseObject(jsonObject.toJSONString(), new TypeReference<JobNodeConfigDto>(){});
//            obj = JobNodeConfig.class.newInstance();
//            BeanMap beanMap = BeanMap.create(obj);
//            beanMap.putAll(map);
            //节点的系统参数
            if(null != nodeParam){
                JSONArray jsonArray = JSONArray.parseArray(nodeParam.toString());
                if(CollectionUtil.isNotEmpty(jsonArray)){
                    List<JSONObject> nodeParam1 = new ArrayList<>();
                    for (Object o : jsonArray) {
                        if(null != o){
                            JSONObject jsonObject1 = JSONObject.parseObject(o.toString());
                            nodeParam1.add(jsonObject1);
                        }
                    }
                    obj.setNodeParam(nodeParam1);
                }
            }
            if(null != jobNodeConfJdbcParamList){
                List<JobNodeConfJdbcParam> jobNodeConfJdbcParams = JSON.parseObject((String) jobNodeConfJdbcParamList, new TypeReference<List<JobNodeConfJdbcParam>>() {});
                obj.setJobNodeConfJdbcParamList(jobNodeConfJdbcParams);
            }
            return obj;
        } catch (Exception e) {
            return null;
        }
    }




    public static Map<?, ?> jobNodeConfigToMap(JobNodeConfigDto jobNodeConfig) {
        if(jobNodeConfig == null)
            return null;
        return new org.apache.commons.beanutils.BeanMap(jobNodeConfig);
    }

}
